#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @author  : liu lijun
# @date    : 2025-10-09
# @description: 清洗数据

import os,re
import pandas as pd
from tqdm import tqdm
from pathlib import Path

def parse_one_file(filepath):
    """解析一个Q&A格式的文本文件，返回问答列表"""
    with open(filepath, "r", encoding="utf-8") as f:       # 防止乱码：文本文件存储为utf-8格式，open时指定encoding为utf-8。
        text = f.read()

    # 按 Q编号 分块，如 Q1、Q2、Q3...把每个问题连同答案放在一个块中。
    blocks = re.split(r'\n*Q\d+\s*\n', text)
    blocks = [b.strip() for b in blocks if b.strip()]

    data = []
    for block in tqdm(blocks, desc=f"解析 {filepath.name}", leave=False):
        lines = [l.strip() for l in block.split('\n') if l.strip()]
        if len(lines) >= 2:
            question = lines[0]
            answer = " ".join(lines[1:])
            data.append({"问题": question, "答案": answer, "来源文件": filepath.name})
    return data

def parse_dir(input_dir,output_file):
    """解析文件夹下所有的文件，并存储为一个csv"""
    all_data = []
    txt_files = list(Path(input_dir).glob("*.txt"))

    if not txt_files:
        print(f"❌ 未找到任何 txt 文件，请将文件放入文件夹：{input_dir.resolve()}")
    else:
        print(f"📂 共发现 {len(txt_files)} 个 txt 文件，开始解析...\n")

        for file in tqdm(txt_files, desc="总体进度"):
            try:
                qa_data = parse_one_file(file)
                all_data.extend(qa_data)
            except Exception as e:
                print(f"⚠️ 文件 {file.name} 解析失败：{e}")

        # 转为DataFrame并清洗
        df = pd.DataFrame(all_data)
        if not df.empty:
            df = df.drop_duplicates().dropna(subset=["问题", "答案"])
            df.to_csv(output_file, index=False, encoding="utf-8")
            print(f"\n✅ 已成功提取 {len(df)} 条问答记录，保存为：{output_file}")
        else:
            print("⚠️ 未提取到有效问答记录。")

if __name__ == "__main__":

    # 获取当前文件的绝对路径
    current_file_path = os.path.abspath(__file__)
    # 获取当前文件所在的文件夹路径
    current_dir = os.path.dirname(current_file_path)

    input_dir = os.path.join(current_dir,"data/raw")  # 存放txt文件的文件夹路径
    output_file = os.path.join(current_dir,"data/qa.csv")

    parse_dir(input_dir,output_file)
